--#include "data\config\equip\EquipStarConfig.lua" once
--#include "data\config\attr\FuncAttrsConfig.lua" once

--[[装备升星强化
flag 	--是否付费提升强化成功率
注意：策划要求，强化成功才扣除材料，强化不成功不扣除材料，但是要损失星级，玩家需要花钱恢复星级
]]
function EquipStar(sysarg, itemPtr, flag)
	--print("EquipStar ...")
	if not itemPtr then
		return
	end

	if not Actor.checkActorLevel( sysarg, EquipStarCfg.levelLimit[2], EquipStarCfg.levelLimit[1] ) then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.COM0016, ttFlyTip)
		return
	end

	local itemid 		= Item.getItemProperty( sysarg, itemPtr, Item.ipItemID, 0)
	local itemType 		= Item.getItemProperty( sysarg, itemPtr, Item.ipItemType, 0)
	local itemStar  	= Item.getItemProperty( sysarg, itemPtr, Item.ipItemStrong, 0)			--强化星级
	local lostStar		= Item.getItemProperty( sysarg, itemPtr, Item.ipItemLostStar, 0)		--损失星级
	local itemStarLimit	= Item.getItemProperty( sysarg, itemPtr, Item.ipItemStrongLimit, 0)		--该装备可强化限制(取配置，不大于itemStarMax)
	local itemStarMax	= GetEquipStarMaxByType( itemType )										--该类型装备可强化的最大星级
	local doStarMax		= 0																		--扣除损失星级是上限
	if itemStarLimit == 0 or itemStarLimit > itemStarMax then
		doStarMax = itemStarMax - lostStar
	else
		doStarMax = itemStarLimit - lostStar
	end

	--print("EquipStar, itemType="..itemType..", itemStar="..itemStar..", itemStarMax="..itemStarMax..", lostStar="..lostStar..
	--	",itemStarLimit="..itemStarLimit..", doStarMax="..doStarMax)
	if itemType < Item.itWeapon or itemType >= Item.itEquipMax then				--不是装备不能强化
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar001, ttFlyTip)
		return
	end

	if itemStar >= doStarMax then												--装备最大属性
		if lostStar > 0 then
			Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar017, ttFlyTip)
		else
			Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar002, ttFlyTip)
		end
		return
	end

	local nextStar = itemStar + 1
	local nextStarCfg = EquipStarCfg.starConsume[nextStar]
	if not nextStarCfg then
		return
	end

	--检查付费提升强化成功率的费用是否足够
	if flag > 0 and not CheckConsumeCond( sysarg, nextStarCfg.addRateConsumes ) then
		return 
	end

	if not CheckConsumeCond( sysarg, nextStarCfg.starConsumes ) then	--检查强化材料是否足够
		return
	end

	--扣除付费提升强化成功率的费用
	if flag > 0 and not DoConsumeCond( sysarg, nextStarCfg.addRateConsumes, 1, 1150, Lang.ScriptTips.EquipLog002  ) then
		return 
	end

	
	--升一星概率
	local starRate = nextStarCfg.starRate or 0   		--升星成功率
	local allRate  = 0
	if flag == 0 then
		allRate = starRate
	else
		local addRate  = nextStarCfg.addRate or 0		--额外购买的成功率
		allRate = starRate + addRate
	end
	local rateNum  = System.getRandomNumber(100)
	--print("EquipStar， starRate="..starRate..", allRate="..allRate..", rateNum="..rateNum)

	if allRate >= rateNum then		--强化成功
		--成功了才扣除强化材料
		if not DoConsumeCond( sysarg, nextStarCfg.starConsumes, 1, 1151, Lang.ScriptTips.EquipLog001 ) then
			return
		end

		Item.setItemProperty( sysarg, itemPtr, Item.ipItemStrong, nextStar)
	    local tips = string.format(Lang.ScriptTips.EquipStar003, nextStar)
	    Actor.sendTipmsg(sysarg, tips, ttFlyTip)

	    SendEquipStarResult(sysarg, 1, 1)
    else
    	Item.setItemProperty( sysarg, itemPtr, Item.ipItemLostStar, lostStar+1)     --损失星级+1
    	Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar006, ttFlyTip)

    	SendEquipStarResult(sysarg, 1, 0)
	end
	Actor.triggerQuestEvent(sysarg, 48, 4, 1) 			--装备操作-强化-1次（成功、失败都算）
end

--[[恢复装备升星强化失败后损失的星级
]]
function EquipRecoverStar( sysarg, itemPtr )
	--print("EquipStar ...")
	if not itemPtr then
		return
	end
    
	local itemType 		= Item.getItemProperty( sysarg, itemPtr, Item.ipItemType, 0)
	local itemStar  	= Item.getItemProperty( sysarg, itemPtr, Item.ipItemStrong, 0)			--强化星级
	local lostStar		= Item.getItemProperty( sysarg, itemPtr, Item.ipItemLostStar, 0)		--损失星级
	local itemStarLimit	= Item.getItemProperty( sysarg, itemPtr, Item.ipItemStrongLimit, 0)		--该装备可强化限制(不大于itemStarMax)
	local itemStarMax	= GetEquipStarMaxByType( itemType )										--该类型装备可强化的最大星级

	local starMax		= 0			--取itemStarLimit与itemStarMax的较小值
	local doStarMax		= 0			--取starMax-lostStar										--扣除损失星级是上限
	if itemStarLimit == 0 or itemStarLimit > itemStarMax then
		starMax 	= itemStarMax
		doStarMax 	= starMax - lostStar
	else
		starMax 	= itemStarLimit
		doStarMax 	= starMax - lostStar
	end
	--print("EquipRecoverStar, itemStar="..itemStar..", lostStar="..lostStar..", starMax="..starMax..", doStarMax="..doStarMax)

	if lostStar <= 0 then		--没有损失的星级
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar007, ttFlyTip)
		return
	end

	local newLostStar = lostStar - 1 				--损失星级-1
	--local recoverStar = doStarMax - newLostStar 	--应该恢复第x个星级
	local recoverStar = doStarMax + 1 				--恢复星级上限+1
	--print("EquipRecoverStar, newLostStar="..newLostStar..", recoverStar="..recoverStar)
	if recoverStar > starMax then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar008, ttFlyTip)
		return
	end

	local recoverStarConsumes = EquipStarCfg.recoverConsume[recoverStar]	--下一级的星级配置  
	if not recoverStarConsumes then
	  	return
	end

	--检查恢复星级条件是否足够
	if not CheckConsumeCond( sysarg, recoverStarConsumes ) then
		--Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar015, ttFlyTip)
		return
	end
	
	--扣除恢复星级条件
	if not DoConsumeCond( sysarg, recoverStarConsumes, 1, 1152, Lang.ScriptTips.EquipLog003 ) then
		return
	end
	Item.setItemProperty( sysarg, itemPtr, Item.ipItemLostStar, newLostStar)     --损失星级+1
    Actor.sendTipmsg(sysarg, string.format(Lang.ScriptTips.EquipStar009, recoverStar), ttFlyTip)
    SendEquipStarResult(sysarg, 2, 1)
end

--装备升星结果
function  SendEquipStarResult(sysarg, StrongType, result)
	local netPack = DataPack.allocPacket(sysarg, enEquipSystemID, sEquipStrongResult)
	if netPack then
		DataPack.writeByte(netPack,StrongType)
		DataPack.writeByte(netPack,result)
		DataPack.flush(netPack)
		--print("SendEquipStarResult, StrongType="..StrongType..", result="..result)
	end
end

--[[
装备强化星级转移
注意；
1、禁止高等级装备向低等级装备转移；
2、强化成功星级、强化损失星级决不能变化，同时转移到目标装备中，否则会导致玩家通过高等级装备转低等级装备洗去损失星级；
]]
function EquipTransferStar( sysarg, itemPtrSrc, itemPtrDes )
	if not itemPtrSrc or not itemPtrDes then
		return
	end

	if Item.isFurnaceEquip( itemPtrSrc ) or Item.isFurnaceEquip( itemPtrDes ) then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar016, ttFlyTip)
		return
	end

	local itemTypeSrc 	= Item.getItemProperty( sysarg, itemPtrSrc, Item.ipItemType, 0)
	local itemStarSrc	= Item.getItemProperty( sysarg, itemPtrSrc, Item.ipItemStrong, 0)
	local lostStarSrc	= Item.getItemProperty( sysarg, itemPtrSrc, Item.ipItemLostStar, 0)
	local starLimitSrc	= Item.getItemProperty( sysarg, itemPtrSrc, Item.ipItemStrongLimit, 0)		--该装备可强化限制

	local itemTypeDes 	= Item.getItemProperty( sysarg, itemPtrDes, Item.ipItemType, 0)
	local itemStarDes   = Item.getItemProperty( sysarg, itemPtrDes, Item.ipItemStrong, 0)
	local lostStarDes	= Item.getItemProperty( sysarg, itemPtrDes, Item.ipItemLostStar, 0)
	local starLimitDes	= Item.getItemProperty( sysarg, itemPtrDes, Item.ipItemStrongLimit, 0)		--该装备可强化限制(不大于itemStarMax)
	local starMaxDes	= GetEquipStarMaxByType( itemTypeDes )										--该类型装备可强化的最大星级

	--print("EquipTransferStar, starLimitSrc="..starLimitSrc..", starLimitDes="..starLimitDes)
	--源装备强化上限大于目标装备强化上限，不能转移（防止玩家洗损失星数）
	if starLimitSrc > starLimitDes then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar019, ttFlyTip)
		return
	end

	local doStarMaxDes	= 0																		--扣除损失星级是上限
	if starLimitDes == 0 or starLimitDes > starMaxDes then
		doStarMaxDes = starMaxDes
	else
		doStarMaxDes = starLimitDes
	end
	--print("EquipTransferStar, itemTypeSrc="..itemTypeSrc..", itemStarSrc="..itemStarSrc..", lostStarSrc="..lostStarSrc..
	--	"; itemTypeDes="..itemTypeDes..", itemStarDes="..itemStarDes..", lostStarDes="..lostStarDes..", doStarMaxDes="..doStarMaxDes)

	if itemStarSrc <=0 then  	--源装备没有强化星级
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar010, ttFlyTip)
		return
	end

	if itemStarDes > 0 then		--目标装备有强化星级
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar011, ttFlyTip)
		return
	end

	if lostStarDes > 0 then		--目标装备有强化失败损失的星级
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar012, ttFlyTip)
		return
	end

	if itemStarSrc > doStarMaxDes then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar013, ttFlyTip)
		return
	end

	local transferConsumes = EquipStarCfg.transferConsume[itemStarSrc]
	if not transferConsumes then
	  	return
	end

	--检查星级转移的条件是否足够
	if not CheckConsumeCond( sysarg, transferConsumes ) then
		return
	end
	
	--扣除转移星级条件
	if not DoConsumeCond( sysarg, transferConsumes, 1, 1153, Lang.ScriptTips.EquipLog004 ) then
		return
	end

	Item.setItemProperty( sysarg, itemPtrSrc, Item.ipItemStrong, 0)					--源装备强化星级清0
	Item.setItemProperty( sysarg, itemPtrSrc, Item.ipItemLostStar, 0)				--源装备强化损失星级清0

	local itemStarSrcNew = Item.getItemProperty( sysarg, itemPtrSrc, Item.ipItemStrong, 0)  	--源装备清0后的强化星级
	local lostStarSrcNew = Item.getItemProperty( sysarg, itemPtrSrc, Item.ipItemLostStar, 0)	--源装备清0后的强化损失星级
	if itemStarSrcNew ~= 0 or lostStarSrcNew ~= 0 then 			--再次检查强化信息，以防万一没有清0(必须都清0才能设置新装备)
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar018, ttFlyTip)
		return
	end

	Item.setItemProperty( sysarg, itemPtrDes, Item.ipItemStrong, itemStarSrc)		--设置目标装备强化星级
	Item.setItemProperty( sysarg, itemPtrDes, Item.ipItemLostStar, lostStarSrc)		--设置目标装备强化损失星级

    Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipStar014, ttFlyTip)

    SendEquipTransferStarResult(sysarg, 1)			--转移成功
end

--装备转移结果
function  SendEquipTransferStarResult(sysarg, result)
	local netPack = DataPack.allocPacket(sysarg,enEquipSystemID, sEquipTransStarResult)
	if netPack then
		DataPack.writeChar(netPack,result)
		DataPack.flush(netPack)
	end
end

function GetEquipStarMaxByType( itemType )
	return #FuncAttrsCfg[enFunctionAttrType_EquipStar][itemType]
end


